/* films3.c -- 使用抽象数据类型 ADT 风格的链表 */
/* compile with list.c      */
#include <stdio.h>
#include <stdlib.h> //提供 exit() 类型
#include "List.h"   //定义 List, Item

void showmovies(Item item);
extern char * s_gets(char str[], int lim);


/* 伪代码方案
 
 创建一个 List 类型的变量
 创建一个 Item 类型的变量
 初始化链表为空
 当链表未满且有输入时:
    把输入读取到 Item 类型的变量中
    在链表末尾添加项
 访问链表中的每个项并显示它们
 
 */
void filmMain4(void)
{
    /* 下述声明创建了一个链表，而不是一个指向节点的指针或一个结构
     *
     */
    List movies;//创建了该链表所需类型的指针
    Item temp;//一个结构类型的数据
    
    
    //初始化为 NULL
    InitializeList(&movies);
    
    //确定链表是否已满
    if (ListIsFull(&movies))
    {
        fprintf(stderr,"没有可用内存! 结束!\n");
        exit(1);
    }
    
    //获取用户输入并存储
    puts("输入第一个电影标题:");
    while (s_gets(temp.title, TSIZE) != NULL && temp.title[0] != '\0')
    {
        puts("输入评分 <0-10>:");
        scanf("%d", &temp.rating);
        while(getchar() != '\n')
            continue;
        if (AddItem(temp, &movies)==false)
        {
            fprintf(stderr,"分配内存问题\n");
            break;
        }
        if (ListIsFull(&movies))
        {
            puts("列表现在已经满了.");
            break;
        }
        puts("输入下一个电影标题 (空行停止):");
    }
    
    //展示
    if (ListIsEmpty(&movies))
        printf("没有数据输入. ");
    else
    {
        printf ("这是电影列表:\n");
        Traverse(&movies, showmovies);
    }
    printf("输入 %d 部电影.\n", ListItemCount(&movies));
    
    
    //清理
    EmptyTheList(&movies);
    printf("结束!\n");
}

void showmovies(Item item)
{
    printf("电影: %s  评分: %d\n", item.title,
           item.rating);
}

